﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using NUnit.Mocks;
using Sistema_Totem.Datos.SqlServer;
using Sistema_Totem.Logica.Clases;
using System.Data;
using System.Data.SqlClient;
using Sistema_Totem.Logica.Excepciones;

namespace Sistema_Totem.Pruebas
{


    [TestFixture]
    public class PruebaSqlCasodeUso
    {

         #region Prueba Buscar Data
        [Test]

        public void PruebaBuscarData()
        {

            List<String> variables = new List<String>();
            List<String> valores = new List<String>();
            List<CasoDeUso> casosuso = new List<CasoDeUso>();
            int idProyecto = 2; // id de proyecto conocido en la BD
            variables.Add("idproyecto");
            valores.Add(idProyecto.ToString());
            SqlDataReader reader =new SqlServerCasosDeUso().BuscarData("[dbo].[ConsultarCasosdeUsoProyecto]", variables, valores);
            Assert.IsNotNull(reader.Read());
            while (reader.Read())
            {
                CasoDeUso casouso = new CasoDeUso(Convert.ToInt32(reader.GetDecimal(0)), reader.GetString(2), Convert.ToInt32(reader.GetDecimal(3)), reader.GetString(4), Convert.ToInt32(reader.GetDecimal(5)), reader.GetString(7));
                Assert.IsNotNull(casouso);
                casosuso.Add(casouso);
            }
            Assert.IsNotNull(casosuso);
                
            Assert.IsNotEmpty(casosuso);

        }

        #endregion Prueba Metodo Consultar Data

         #region Prueba Agregar Caso De Uso
        /// <summary>
        /// Pruebas unitaria para el metodo Agregar Caso De Uso. Se crea un Caso De Uso de prueba (con datos conocidos).
        /// el metodo AgregarCasoDeUso devuelve un valor entero "1" si fue exitosamente ejecutado, se compara este valor y ademas
        /// se consulta el detalle del actor (una vez almacenado) con el actor de prueba de manera que se verifique que 
        /// fue efectivamente agregado.
        /// </summary>
        [Test]

        public void PruebaAgregarCU()
        {

            CasoDeUso casoDeUsoInsertarPrueba = new CasoDeUso(1, "codigo de prueba agregar", 1, "nombre de prueba", 1, "Req1");
            SqlServerCasosDeUso insertarCU = new SqlServerCasosDeUso();
            int casoUInsertado = insertarCU.AgregarCasoDeUso(casoDeUsoInsertarPrueba, 3);
            Assert.AreEqual(1, casoUInsertado);
            CasoDeUso detalleCU = new CasoDeUso();
            detalleCU = insertarCU.DetalleCasodeUso(1);
            Assert.IsTrue(detalleCU.Equals(casoDeUsoInsertarPrueba));

            
        }

        #endregion Prueba Agregar Caso De Uso
        
         #region Prueba Ver Detalle Caso De Uso
        /// <summary>
        /// Pruebas unitaria para el metodo VerDetalleCasoDeUso. Se crea un Caso De Uso de prueba (con datos conocidos).
        /// el metodo AgregarCasoDeUso devuelve un valor entero "1" si fue exitosamente ejecutado, se compara este valor y ademas
        /// se consulta el detalle del actor (una vez almacenado) con el actor de prueba de manera que se verifique que 
        /// fue efectivamente agregado y que la consulta del detalle coincide con la esperada
        /// </summary>
        [Test]

        public void PruebaVerDetalleCasoDeUso()
        {
            CasoDeUso casoDetalle = new CasoDeUso();
            CasoDeUso detalleCU = new CasoDeUso();
            casoDetalle.Codigo = "Codigo de Prueba Detalle";
            casoDetalle.Id = 1;
            casoDetalle.Numero = 1;
            casoDetalle.Secciones = 1;
            casoDetalle.Requerimiento = "Req1";
            casoDetalle.Nombre = "Nombre Prueba Detalle";
            CasoDeUso casoDeUsoInsertarPrueba = new CasoDeUso(1, "Codigo de Prueba Detalle", 1, "Nombre Prueba Detalle", 1, "Req1");
            SqlServerCasosDeUso insertarCU = new SqlServerCasosDeUso();
            int casoUInsertado = insertarCU.AgregarCasoDeUso(casoDeUsoInsertarPrueba, 3);
            SqlServerCasosDeUso casoConsultar = new SqlServerCasosDeUso();
            detalleCU = casoConsultar.DetalleCasodeUso(1);
            Assert.AreEqual(1, casoUInsertado);
            Assert.IsTrue(casoDetalle.Equals(detalleCU));
        }

        #endregion Prueba Agregar Caso De Uso

         #region Prueba Consultar Caso De Uso
        /// <summary>
        /// Pruebas unitaria para el metodo Consultar Caso De Uso. Se declaran 2 listas, una contiene datos conocidos que seran insertados
        /// en base de datos para despues ser consultados al ejecutar < compararCU = CU.ConsultarCasoDeUso(3)>. los valores de 
        /// idRequerimiento, idCU son conocidos y existen en almacenamiento
        /// </summary>
        [Test]

        public void PruebaConsultarCU()
        {


            List<CasoDeUso> agregarCU = new List<CasoDeUso>();
            List<CasoDeUso> compararCU = new List<CasoDeUso>();
            agregarCU.Add(new CasoDeUso(1, "codigo de prueba Consultar0", 1, "nombre de prueba", 1, "Req1"));
            agregarCU.Add(new CasoDeUso(2, "codigo de prueba Consultar1", 1, "nombre de prueba", 1, "Req1"));
            agregarCU.Add(new CasoDeUso(3, "codigo de prueba Consultar2", 1, "nombre de prueba", 1, "Req1"));
            int i = 0;
            while (i <= (agregarCU.Count - 1))
            {
                CasoDeUso casoDeUsoInsertarPrueba = new CasoDeUso((i+1), "codigo de prueba Consultar"+i, 1, "nombre de prueba", 1, "Req1");
                SqlServerCasosDeUso insertarCU = new SqlServerCasosDeUso();
                int casoUInsertado = insertarCU.AgregarCasoDeUso(casoDeUsoInsertarPrueba, 3);
                Assert.AreEqual(1, casoUInsertado);
                i++;
            }

            SqlServerCasosDeUso CU = new SqlServerCasosDeUso();
            compararCU = CU.ConsultarCasoDeUso(3);
           
             for ( int j =0; j<compararCU.Count;j++)
                 {
                     Assert.IsTrue(compararCU.ElementAt(j).Equals(agregarCU.ElementAt(j)));
                 }
       

        }

        #endregion Prueba Agregar Caso De Uso

        }
}